/*
 * Copyright (c) 2021. 广州凡岛网络科技有限公司。
 * 版权©️所有，请勿随意删除、修改此头部，切勿以任何方式外泄源代码、设计图、数据库等资料！违者后果自负
 *
 *   .--.,                               ,---,
 * ,--.'  \                  ,---,     ,---.'|               ,---.
 * |  | /\/              ,-+-. /  |    |   | :              '   ,'\
 * :  : :    ,--.--.    ,--.'|'   |    |   | |   ,--.--.   /   /   |
 * :  | |-, /       \  |   |  ,"' |  ,--.__| |  /       \ .   ; ,. :
 * |  : :/|.--.  .-. | |   | /  | | /   ,'   | .--.  .-. |'   | |: :
 * |  |  .' \__\/: . . |   | |  | |.   '  /  |  \__\/: . .'   | .; :
 * '  : '   ," .--.; | |   | |  |/ '   ; |:  |  ," .--.; ||   :    |
 * |  | |  /  /  ,.  | |   | |--'  |   | '/  ' /  /  ,.  | \   \  /
 * |  : \ ;  :   .'   \|   |/      |   :    :|;  :   .'   \ `----'
 * |  |,' |  ,     .-./'---'        \   \  /  |  ,     .-./
 * `--'    `--`---'                  `----'    `--`---'
 *
 *                   让 更 美 的 生 活 触 手 可 及
 */
package com.itheima.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
 * <h1>全局线程池配置类</h1>
 *
 * <p>用于自动装配 SpringBoot 的异步功能组件</p>
 * <p>生成一个全局可使用的线程池，只要在其他代码处注入线程池对象即可</p>
 * <p>可用于 @Async 注解声明的线程池对象</p>
 *
 * @author <a href="515857087@qq.com">叶世铭</a>
 * @version 1.0.0
 * @since 2023/01/05
 */
@Slf4j
@EnableAsync
@Configuration
public class ThreadPoolConfig {
	
	@Value("${backend.threalpool.corePoolSize:20}")
	private Integer corePoolSize;
	
	@Value("${backend.threalpool.maxPoolSize:100}")
	private Integer maxPoolSize;
	
	@Value("${backend.threalpool.queueCapacity:250}")
	private Integer queueCapacity;
	
	@Value("${backend.threalpool.keepAliveSeconds:30}")
	private Integer keepAliveSeconds;
	
	/**
	 * 初始化线程池
	 *
	 * @return 线程池实例
	 */
	@Bean(name = "global-executor")
	public ThreadPoolTaskExecutor asyncExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setCorePoolSize(corePoolSize);
		executor.setMaxPoolSize(maxPoolSize);
		executor.setQueueCapacity(queueCapacity);
		executor.setKeepAliveSeconds(keepAliveSeconds);
		executor.initialize();
		log.debug("全局线程池【global-executor】初始化完毕！！");
		return executor;
	}
	
}
